#ifndef FSM_EDGE_COMPUTING_H
#define FSM_EDGE_COMPUTING_H

#include <iomanip>
#include <ctime>
#include <cstdio>
#include <iostream>
#include <string>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstring>
#include <cmath>
#include <iostream>
#include <string>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
//#include <stdio.h>
//#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <cstring>
#include <iostream>
//#include <thread>
#include <chrono>
#include <condition_variable>
#include <queue>
#include <mutex>
#include <functional>
#include <cstdlib>
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/errno.h>
#include <cstring>

#include "Logger.h"
#include "cJSON.h"

#define BUFFSIZE 1024


//class Timer {
//public:
//    Timer(unsigned int interval_ms) :
//            interval_ms_(interval_ms), count_(0), stop_(false) {}
//
//    void start() {
//        std::thread timer_thread(&Timer::timer_func, this);
//        timer_thread.detach();
//    }
//
//    void stop() {
//        stop_ = true;
//    }
//
//    void set_interval(unsigned int interval_ms) {
//        interval_ms_ = interval_ms;
//    }
//
//    unsigned int get_count() const {
//        return count_;
//    }
//
//    typedef std::function<void()> Action;
//    void on_timer(Action action) {
//        action_ = action;
//    }
//
//private:
//    unsigned int interval_ms_;
//    unsigned int count_;
//    bool stop_;
//    Action action_;
//
//    std::queue<Action> queue_;
//    std::mutex queue_mutex_;
//    std::condition_variable queue_cv_;
//
//    void timer_func() {
//        while (!stop_) {
//            std::unique_lock<std::mutex> lock(queue_mutex_);
//            queue_cv_.wait_for(lock, std::chrono::milliseconds(interval_ms_));
//            ++count_;
//            if (action_) {
//                action_();
//            }
//        }
//    }
//};


using namespace std;


void send_data(char *buf);
void startup();
void set_timer();
void collect_data(char *buf_token_);
void communicate1();
void send_data(char *buf);
void goodbye(char *buf_token_);
void communicate_to_Getter();
void write_log(char *filename,char *content);
void file_clear();
void *pthcollect(void *client_fd);


#endif //FSM_EDGE_COMPUTING_H